package com.elective.courseselect.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.elective.courseselect.dao.CourseDao;
import com.elective.courseselect.entity.CourseCharacterEntity;
import com.elective.courseselect.entity.CourseEntity;
import com.elective.courseselect.entity.CourseQuestionnaireEntity;
import com.elective.courseselect.entity.QuestionnaireEntity;
import com.elective.courseselect.enums.CourseStatus;
import com.elective.courseselect.enums.QuestionnaireStatus;
import com.elective.courseselect.enums.QuestionnaireType;
import com.elective.courseselect.service.*;
import com.elective.courseselect.serviceUtils.CourseUtils;
import com.elective.courseselect.serviceUtils.UserUtils;
import com.elective.courseselect.utils.PageUtils;
import com.elective.courseselect.utils.Query;
import com.elective.courseselect.utils.R;
import com.elective.status.StatusCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


@Transactional(rollbackFor = Exception.class)
@Service("courseService")
public class CourseServiceImpl extends ServiceImpl<CourseDao, CourseEntity> implements CourseService {

    @Autowired
    UserService userService;

    @Autowired
    CourseService courseService;

    @Autowired
    CourseCharacterService courseCharacterService;

    @Autowired
    CharacterService characterService;

    @Autowired
    QuestionnaireService questionnaireService;

    @Autowired
    CourseQuestionnaireService courseQuestionnaireService;

    @Autowired
    private CourseDao courseDao;


    @Override
    public PageUtils queryPage(Map<String, Object> params, CourseEntity courseEntity) {
        Integer role = Integer.valueOf((String) params.get("role"));

        // 查询出 正常的 课程列表
        //courseEntity.setStatus(StatusCode.NORMAL);
        QueryWrapper<CourseEntity> wrapper = createExample(null);
        IPage<CourseEntity> page = this.page(
                new Query<CourseEntity>().getPage(params),
                wrapper
        );
        //计算课余量
        for (Object o : page.getRecords()) {
            CourseEntity course = (CourseEntity) o;
            CourseUtils.getCourseNumRemaining(course);
        }


        List<CourseEntity> tempRes = new ArrayList<>();
        for (CourseEntity course : page.getRecords()) {

            course.setScheduleByJson((JSONObject) JSONObject.parse(course.getSchedule()));
            CourseUtils.getCourseLabels(course);

            //过滤弃用老师
            Boolean abandon = UserUtils.isAbandon(course.getTeacherId());
            if (abandon) {
                continue;
            }
            if (StatusCode.ROLE_STU == role) {
                //过滤不是普通的课程
                Boolean courseIsAbandon = CourseUtils.courseIsAbandon(course.getId());
                if (!courseIsAbandon) {
                    tempRes.add(course);
                }
            } else if (StatusCode.ROLE_TEA == role) {
                //过滤不是普通的课程
                Boolean courseIsAbandon = CourseUtils.courseLookByTea(course.getId());
                if (!courseIsAbandon) {
                    tempRes.add(course);
                }
            }
            //管理员 什么都能看
            else {
                tempRes.add(course);
            }
        }
        page.setRecords(tempRes);
        return new PageUtils(page);
    }

    @Override
    public CourseEntity searchCourseInfo(Integer courseId) {
        CourseEntity courseEntity = new CourseEntity();
        courseEntity.setId(courseId);
        QueryWrapper courWrapper = createExample(courseEntity);
        courseEntity = this.getOne(courWrapper);
        //得到课程标签
        CourseUtils.getCourseLabels(courseEntity);
        //得到课程评论
        CourseUtils.getCourseComment(courseEntity);
        //得到调查问卷
        CourseUtils.getCourseQuestionnaire(courseEntity);

        courseEntity.setScheduleByJson((JSONObject) JSONObject.parse(courseEntity.getSchedule()));
        return courseEntity;
    }

    @Override
    public void updateCourse(CourseEntity course) {

        if (null != course.getScheduleByJson()) {
            String scheduleByJson = course.getScheduleByJson().toJSONString();
            course.setSchedule(scheduleByJson);
        }


        this.updateById(course);

        if (!CollectionUtils.isEmpty(course.getLabelIdList())) {
            // 删除以前的课程标签
            QueryWrapper<CourseCharacterEntity> courseCharacterEntityQueryWrapper = new QueryWrapper<>();
            courseCharacterEntityQueryWrapper.eq("course_id", course.getId());
            courseCharacterService.remove(courseCharacterEntityQueryWrapper);
            for (Integer UpdateLabelId : course.getLabelIdList()) {
                CourseCharacterEntity characterEntity = new CourseCharacterEntity();
                characterEntity.setCharacterId(UpdateLabelId);
                characterEntity.setCourseId(course.getId());
                courseCharacterService.save(characterEntity);
            }
        }

    }

    @Override
    public void createCourse(CourseEntity course) {
        //设置修改中
        course.setStatus(CourseStatus.COURSE_MODIFY);
        this.save(course);
        QuestionnaireEntity questionnaireEntity = new QuestionnaireEntity();
        questionnaireEntity.setName("系统根据新增课程自动创建的调查问卷-" + course.getId());
        //默认课程意愿调查问卷
        questionnaireEntity.setStatus(QuestionnaireStatus.APPLICATION_PASS);
        questionnaireEntity.setType(QuestionnaireType.COURSE_WILL_QUESTIONNAIRE);
        questionnaireService.save(questionnaireEntity);
        CourseQuestionnaireEntity courseQuestionnaireEntity = new CourseQuestionnaireEntity();
        courseQuestionnaireEntity.setCourseId(course.getId());
        courseQuestionnaireEntity.setQuestionnaireId(questionnaireEntity.getId());
        courseQuestionnaireService.save(courseQuestionnaireEntity);
    }

    @Override
    public void delCourse(Integer[] courseIds) {
        courseDao.delBatchAccount(courseIds);
    }

    @Override
    public PageUtils searchCourseByModifyList(Map<String, Object> params, CourseEntity courseEntity) {
        //courseEntity.setStatus(StatusCode.COURSE_MODIFY);
        QueryWrapper<CourseEntity> wrapper = createExample(courseEntity);
        IPage<CourseEntity> page = this.page(
                new Query<CourseEntity>().getPage(params),
                wrapper
        );
        //计算课余量
        for (Object o : page.getRecords()) {
            CourseEntity course = (CourseEntity) o;
            CourseUtils.getCourseNumRemaining(course);
        }

        for (int i = 0; i < page.getRecords().size(); i++) {
            CourseEntity course = page.getRecords().get(i);
            //过滤老师
            Boolean abandon = UserUtils.isAbandon(course.getTeacherId());
            if (abandon) {
                page.getRecords().remove(i);
                continue;
            }
            //过滤被禁用的课程
            if (course.getStatus() == CourseStatus.COURSE_MODIFY) {
                page.getRecords().remove(i);
                continue;
            }
            course.setScheduleByJson((JSONObject) JSONObject.parse(course.getSchedule()));
            CourseUtils.getCourseLabels(course);
        }
        return new PageUtils(page);
    }

    @Override
    public R auditCourse(CourseEntity courseEntity) {
        Integer id = courseEntity.getId();
        CourseEntity byId = this.getById(id);
        if (null == byId) {
            return R.error(StatusCode.ERROR, "该门课程不存在");
        }
        this.updateCourse(courseEntity);
        return R.ok(StatusCode.OK, "审核课程信息修改成功");

    }


    /**
     * Application构建查询对象
     *
     * @param courseEntity
     * @return
     */
    public static QueryWrapper createExample(CourseEntity courseEntity) {
        QueryWrapper<CourseEntity> wrapper = new QueryWrapper<>();
        if (courseEntity != null) {
            //
            if (!StringUtils.isEmpty(courseEntity.getId())) {
                wrapper.eq("id", courseEntity.getId());
            }
            //
            if (!StringUtils.isEmpty(courseEntity.getTeacherId())) {
                wrapper.eq("teacher_id", courseEntity.getTeacherId());
            }
            //
            if (!StringUtils.isEmpty(courseEntity.getName())) {
                wrapper.eq("name", courseEntity.getName());
            }

            if (!StringUtils.isEmpty(courseEntity.getClassroom())) {
                wrapper.eq("classroom", courseEntity.getClassroom());
            }

            if (!StringUtils.isEmpty(courseEntity.getSchedule())) {
                wrapper.eq("schedule", courseEntity.getSchedule());
            }

            if (!StringUtils.isEmpty(courseEntity.getSemester())) {
                wrapper.eq("semester", courseEntity.getSemester());
            }

            if (!StringUtils.isEmpty(courseEntity.getCredit())) {
                wrapper.eq("credit", courseEntity.getCredit());
            }

            if (!StringUtils.isEmpty(courseEntity.getLanguage())) {
                wrapper.eq("language", courseEntity.getLanguage());
            }

            if (!StringUtils.isEmpty(courseEntity.getEvaluation())) {
                wrapper.eq("evaluation", courseEntity.getEvaluation());
            }

            if (!StringUtils.isEmpty(courseEntity.getRequirement())) {
                wrapper.eq("requirement", courseEntity.getRequirement());
            }

            if (!StringUtils.isEmpty(courseEntity.getIntroduction())) {
                wrapper.eq("introduction", courseEntity.getIntroduction());
            }

            if (!StringUtils.isEmpty(courseEntity.getAmount())) {
                wrapper.eq("amount", courseEntity.getAmount());
            }
            if (!StringUtils.isEmpty(courseEntity.getStatus())) {
                wrapper.eq("status", courseEntity.getStatus());
            }
        }
        return wrapper;
    }


}